JUnit হল একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশনের জন্য ইউনিট টেস্টিং করতে ব্যবহৃত হয়। এটি ডেভেলপারদের কোডের ভ্যালিডিটি যাচাই করতে এবং সঠিক ফলাফল নিশ্চিত করতে সাহায্য করে। H2 Database হল একটি লাইটওয়েট, ইন-মেমরি রিলেশনাল ডেটাবেজ, যা সাধারণত টেস্টিং এবং ডেভেলপমেন্টের জন্য ব্যবহৃত হয়।
JUnit এবং H2 এর ইন্টিগ্রেশন ডেভেলপারদেরকে টেস্টিং এর সময় একটি ইন-মেমরি ডেটাবেজ ব্যবহার করতে দেয়, যাতে ডেটাবেজের ডেটা সরাসরি মেমরিতে থাকে এবং টেস্টিংয়ের পরে সেটি মুছে ফেলা হয়। এটি টেস্টিং দ্রুত এবং কার্যকরী করে তোলে।
এই টিউটোরিয়ালে আমরা JUnit এবং H2 ডেটাবেজের ইন্টিগ্রেশন নিয়ে আলোচনা করব এবং দেখাবো কীভাবে আপনি JUnit ব্যবহার করে H2 ডেটাবেজে টেস্ট কেস লিখতে পারেন।
JUnit এবং H2 Integration সেটআপ
JUnit এবং H2 ইন্টিগ্রেশন করতে হলে প্রথমে আপনাকে কিছু নির্দিষ্ট ডিপেনডেন্সি যুক্ত করতে হবে। H2 একটি ইন-মেমরি ডেটাবেজ, তাই টেস্টিংয়ের জন্য এটি খুবই উপযোগী। এখানে আমরা JUnit 5 এবং H2 ডেটাবেজের একটি সাধারণ ইন্টিগ্রেশন দেখাবো।
১. Maven বা Gradle ডিপেনডেন্সি সেটআপ
Maven ব্যবহার করলে pom.xml ফাইলে নিচের ডিপেনডেন্সি যুক্ত করুন:
<dependencies>
<!-- JUnit 5 Dependency -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.2</version>
<scope>test</scope>
</dependency>
<!-- H2 Database Dependency -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
</dependencies>
Gradle ব্যবহার করলে build.gradle ফাইলে এই ডিপেনডেন্সি যুক্ত করুন:
dependencies {
// JUnit 5 Dependency
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2'
// H2 Database Dependency
testImplementation 'com.h2database:h2:1.4.200'
}
২. JUnit টেস্ট ক্লাস তৈরি করা
এখন, JUnit ব্যবহার করে H2 ডেটাবেজের সাথে কাজ করার জন্য একটি টেস্ট ক্লাস তৈরি করা হবে। আমরা একটি সাধারণ Student টেবিল তৈরি করব এবং H2 ডেটাবেজে টেস্ট কেস লিখব।
import org.junit.jupiter.api.*;
import java.sql.*;
import static org.junit.jupiter.api.Assertions.*;
class H2DatabaseTest {
private static Connection connection;
@BeforeAll
static void setup() throws SQLException {
// H2 Database connection setup
connection = DriverManager.getConnection("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1", "sa", "");
Statement stmt = connection.createStatement();
stmt.execute("CREATE TABLE students (id INT PRIMARY KEY, name VARCHAR(255), age INT)");
}
@AfterAll
static void tearDown() throws SQLException {
// Close connection after tests are done
connection.close();
}
@Test
void testInsertStudent() throws SQLException {
// Insert data into students table
String insertSQL = "INSERT INTO students (id, name, age) VALUES (1, 'John Doe', 22)";
PreparedStatement stmt = connection.prepareStatement(insertSQL);
stmt.executeUpdate();
// Check if the student is inserted successfully
String selectSQL = "SELECT name FROM students WHERE id = 1";
ResultSet rs = stmt.executeQuery(selectSQL);
assertTrue(rs.next());
assertEquals("John Doe", rs.getString("name"));
}
@Test
void testUpdateStudent() throws SQLException {
// Insert data into students table
String insertSQL = "INSERT INTO students (id, name, age) VALUES (2, 'Jane Doe', 20)";
PreparedStatement stmt = connection.prepareStatement(insertSQL);
stmt.executeUpdate();
// Update student data
String updateSQL = "UPDATE students SET age = 21 WHERE id = 2";
stmt.executeUpdate(updateSQL);
// Verify the data is updated
String selectSQL = "SELECT age FROM students WHERE id = 2";
ResultSet rs = stmt.executeQuery(selectSQL);
assertTrue(rs.next());
assertEquals(21, rs.getInt("age"));
}
@Test
void testDeleteStudent() throws SQLException {
// Insert data into students table
String insertSQL = "INSERT INTO students (id, name, age) VALUES (3, 'Mike Doe', 25)";
PreparedStatement stmt = connection.prepareStatement(insertSQL);
stmt.executeUpdate();
// Delete student data
String deleteSQL = "DELETE FROM students WHERE id = 3";
stmt.executeUpdate(deleteSQL);
// Verify the student is deleted
String selectSQL = "SELECT id FROM students WHERE id = 3";
ResultSet rs = stmt.executeQuery(selectSQL);
assertFalse(rs.next());
}
}
৩. টেস্ট ক্লাসের ব্যাখ্যা
@BeforeAll: এই অ্যানোটেশনটি একটি মেথডের উপরে ব্যবহার করা হয় যা সমস্ত টেস্টের আগে একবারই চালানো হয়। এটি H2 ডেটাবেজের জন্য একটি কনেকশন তৈরি করে এবংstudentsটেবিলটি তৈরি করে।@AfterAll: এই অ্যানোটেশনটি একটি মেথডের উপরে ব্যবহার করা হয় যা সমস্ত টেস্টের পরে একবারই চালানো হয়। এটি ডেটাবেজ কনেকশনটি বন্ধ করে।@Test: এই অ্যানোটেশনটি টেস্ট মেথডের উপরে ব্যবহার করা হয়। এই মেথডগুলোতে SQL কুয়েরি এক্সিকিউট করা হয় এবং পরীক্ষণ করা হয় যে প্রত্যাশিত ফলাফল এসেছে কিনা।assertTrue,assertFalse,assertEquals: এগুলি JUnit Assertions, যা বিভিন্ন শর্ত পরীক্ষা করতে ব্যবহৃত হয়।
JUnit এবং H2 এর সুবিধা
- ইন-মেমরি ডেটাবেজ: H2 ডেটাবেজ ইন-মেমরি মোডে কাজ করে, যা টেস্টিংয়ের জন্য দ্রুত এবং কার্যকরী। টেস্টের পরে ডেটাবেজের ডেটা মুছে ফেলা যায়।
- প্রতিটি টেস্টের জন্য নতুন ডেটাবেজ: H2 ইন-মেমরি ডেটাবেজ সাপোর্ট করার কারণে, আপনি প্রতিটি টেস্ট কেসে একটি নতুন ডেটাবেজ তৈরি করতে পারেন, যার ফলে টেস্টিংয়ের সময় ডেটা পরিষ্কার থাকে এবং কোডের কোনও স্টেট ঝুঁকি থাকে না।
- বিভিন্ন টেস্ট কেসে ডেটাবেজের আর্গুমেন্ট: H2 ডেটাবেজ ব্যবহার করে আপনি বিভিন্ন SQL অপারেশন যেমন
INSERT,UPDATE,DELETEপরীক্ষা করতে পারেন। - কনফিগারেশন এবং পারফরম্যান্স: এটি দ্রুত কনফিগারেশন এবং রিসোর্স ব্যবহারের মাধ্যমে বিভিন্ন ডেটাবেজ অপারেশন টেস্ট করার সুবিধা প্রদান করে।
উপসংহার
JUnit এবং H2 ডেটাবেজের ইন্টিগ্রেশন আপনাকে আপনার Java অ্যাপ্লিকেশন বা সিস্টেমের জন্য সহজ এবং কার্যকরী টেস্টিং পরিবেশ প্রদান করে। H2 ডেটাবেজের ইন-মেমরি প্রকৃতি এবং JUnit ফ্রেমওয়ার্কের শক্তি দিয়ে আপনি দ্রুত, কার্যকরী এবং নির্ভরযোগ্য ইউনিট টেস্ট লিখতে পারেন।